/**
 * 
 */
package com.ms.game.log;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import com.ms.service.module.gamelog.GameLogModule;
import com.ms.service.module.gamelog.LogProcTaskTimer;
import com.xpec.c4.db.model.log.basic.BasicLogModel;
import com.xpec.c4.game.utility.GUID;
import com.xpec.c4.game.utility.JsonConvert;
import com.xpec.c4.service.module.BasicServiceModule;

//TODO kevin txtlog 沒問題的話就可以把底下重複的 method 合併
/**
 * 寫入 log 到 db 都透過這個來進行
 * <p>
 * 目前的做法是用 {@link DbLogManager} 將 log model 寫成文字檔暫存起來，再用 {@link GameLogModule}
 * 的定時處理 {@link LogProcTaskTimer} 將暫存的 log 寫回 db。
 * 
 * @author TW15010
 */
public class DbLogManager {
	private static final Log log = LogFactory.getLog(DbLogManager.class);
	
	private static final Log txtLog = LogFactory.getLog("com.ms.game.log.DbLogManager.txtLog");

	/**
	 * 停用，請改用 {@link DbLogManager#savaLog(BasicLogModel)}
	 * <p>
	 * 寫入 log 到 db 的共用 function (限主線程使用)
	 * 
	 * @param module
	 *            觸發事件需要寫 log 的 module instance
	 * @param eventTriggerId
	 *            觸發事件的玩家 guid，會用這個 guid 來分配要用那一個 thread 進行 db 寫入
	 * @param logModelObject
	 *            要寫入的 log model，必須繼承 {@link BasicLogModel}
	 */
	@Deprecated
	public static <T extends BasicLogModel> void saveLog(BasicServiceModule module, GUID eventTriggerId,
			T logModelObject) {
		saveToText(logModelObject);
	}

	/**
	 * 停用，請改用 {@link DbLogManager#savaLog(BasicLogModel)}
	 * <p>
	 * 在異步處理線程中寫入 log
	 * 
	 * @param logModelObject
	 *            要寫入的 log model，必須繼承 {@link BasicLogModel}
	 */
	@Deprecated
	public static <T extends BasicLogModel> void saveLogInAsync(T logModelObject) {
		saveToText(logModelObject);
	}

	/**
	 * @param logModelObject
	 *            無異步寫入
	 *            原本就在異步內時使用
	 */
	public static <T extends BasicLogModel> void savaLog(T logModelObject) 
	{
		saveToText(logModelObject);
	}

	/**
	 * 將 log model 物件轉成 json 寫到暫存的 log 文字檔中
	 * 
	 * @param logModelObject
	 *            log model 物件
	 */
	private static <T extends BasicLogModel> void saveToText(T logModelObject) {
		if (logModelObject == null) {
			return;
		}

		String json;
		try {
			json = JsonConvert.toJson(logModelObject);
		} catch (Exception e) {
			log.error("object to json fail.", e);
			return;
		}
		
		// 寫入暫存檔
		txtLog.fatal(json);
	}
}
